home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2007 September / PCWSEP07.iso / Software / Linux / Linux Mint 3.0 Light / LinuxMint-3.0-Light.iso / casper / filesystem.squashfs / usr / share / initramfs-tools / hook-functions next >
Encoding:
Text File  |  2007-03-23  |  7.0 KB  |  314 lines

  1. # -*- shell-script -*-
  2.  
  3. catenate_cpiogz() {
  4.     # Sanity check
  5.     if [ ! -e "${1}" ]; then
  6.         echo "W:catenate_cpiogz: arg1='${1}' does not exist." >&2
  7.         return
  8.     fi
  9.  
  10.     cat "${1}" >>"${__TMPCPIOGZ}"
  11. }
  12.  
  13. force_load()
  14. {
  15.         manual_add_modules ${@}
  16.         echo "${@}" >>"${DESTDIR}/conf/modules"
  17. }
  18.  
  19. # Takes a file containing a list of modules to be added as an
  20. # argument, figures out dependancies, and adds them.
  21. #
  22. # Input file syntax:
  23. #
  24. #   # comment
  25. #   modprobe_module_name [args ...]
  26. #   [...]
  27. #
  28. add_modules_from_file()
  29. {
  30.     # Sanity check
  31.     if [ ! -e "${1}" ]; then
  32.         echo "W:add_modules_from_file: arg1='${1}' does not exist." >&2
  33.         return
  34.     fi
  35.  
  36.     sed -e '/^#/d' ${1} | while read module rest; do
  37.         force_load "${module}" "${rest}"
  38.     done
  39. }
  40.  
  41. manual_add_modules()
  42. {
  43.     for mam_x in $(modprobe --set-version="${version}" --ignore-install \
  44.     --show-depends "${1}" 2>/dev/null | awk '/^insmod/ { print $2 }'); do
  45.         # Prune duplicates
  46.         if [ -e "${DESTDIR}/${mam_x}" ]; then
  47.             continue
  48.         fi
  49.  
  50.         mkdir -p "${DESTDIR}/$(dirname "${mam_x}")"
  51.         ln -s "${mam_x}" "${DESTDIR}/$(dirname "${mam_x}")"
  52.         if [ -n "${verbose}" ] && [ "${verbose}" = "y" ]; then
  53.             echo "Adding module ${mam_x}"
  54.         fi
  55.     done
  56. }
  57.  
  58. manual_add_firmware()
  59. {
  60.     for x_firm in $(find "/lib/firmware/${version}" -name "${1}" -print); do
  61.         if [ -e "${DESTDIR}/${x_firm}" ]; then
  62.             continue
  63.         fi
  64.  
  65.         mkdir -p "${DESTDIR}/$(dirname "${x_firm}")"
  66.         ln -s "${x_firm}" "${DESTDIR}/$(dirname "${x_firm}")"
  67.         if [ -n "${verbose}" -a "${verbose}" = "y" ]; then
  68.             echo "Adding firmware ${x_firm}"
  69.         fi
  70.         done
  71. }
  72.  
  73. # $1 is source
  74. # $2 is relative destination
  75. copy_exec() {
  76.     final_destination=${DESTDIR}/${2}/`basename ${1}`
  77.     if [ -L "$final_destination" ]; then
  78.         if ! [ `readlink ${final_destination}` = "${1}" ]; then
  79.             echo "W:copy_exec: Not copying ${1} to \$DESTDIR${2}/`basename ${1}`, which is already a copy of `readlink ${final_destination}`" >&2
  80.             return
  81.         fi
  82.     else
  83.         ln -s ${1} ${DESTDIR}/${2}
  84.         if [ -n "${verbose}" ] && [ "${verbose}" = "y" ]; then
  85.             echo "Adding binary ${1}"
  86.         fi
  87.     fi
  88.  
  89.     # Copy the dependant libraries
  90.     for x in $(ldd ${1} 2>/dev/null | sed -e '
  91.         /\//!d;
  92.         /linux-gate/d;
  93.         /=>/ {s/.*=>[[:blank:]]*\([^[:blank:]]*\).*/\1/};
  94.         s/[[:blank:]]*\([^[:blank:]]*\) (.*)/\1/' 2>/dev/null); do
  95.  
  96.         # Try to use non-optimised libraries where possible.
  97.         # We assume that all HWCAP libraries will be in tls.
  98.         nonoptlib=$(echo ${x} | sed -e 's#/lib/tls.*/\(lib.*\)#/lib/\1#')
  99.  
  100.         if [ -e ${nonoptlib} ]; then
  101.             x=${nonoptlib}
  102.         fi
  103.  
  104.         libname=$(basename ${x})
  105.         dirname=$(dirname ${x})
  106.  
  107.         mkdir -p ${DESTDIR}/${dirname}
  108.         if [ ! -e ${DESTDIR}/${dirname}/${libname} ]; then
  109.             ln -s ${x} ${DESTDIR}/${dirname}
  110.             if [ -n "${verbose}" ] && [ "${verbose}" = "y" ]; then
  111.                 echo "Adding library ${x}"
  112.             fi
  113.         fi
  114.     done
  115. }
  116.  
  117. # Copy entire subtrees to the initramfs
  118. copy_modules_dir()
  119. {
  120.     if ! [ -d "${MODULESDIR}/${1}" ]; then
  121.         return;
  122.     fi
  123.     if [ -n "${verbose}" ] && [ "${verbose}" = "y" ]; then
  124.         echo "Copying module directory ${1}"
  125.     fi
  126.     for x_mod in $(find "${MODULESDIR}/${1}" -name '*.ko' -print); do
  127.         manual_add_modules `basename ${x_mod} .ko`
  128.     done
  129. }
  130.  
  131. dep_add_modules()
  132. {
  133.  
  134.     # Things that are too hard to autodetect.
  135.     for x in md raid0 raid1 raid5 raid6 ext2 ext3 isofs jfs nfs reiserfs udf xfs af_packet dm_mod; do
  136.         manual_add_modules ${x}
  137.     done
  138.  
  139.     for x in /sys/bus/pci/devices/*; do
  140.         if [ -e "${x}/modalias" ]; then
  141.             manual_add_modules $(cat "${x}/modalias")
  142.         fi
  143.     done
  144.  
  145.     for x in /sys/bus/usb/devices/*; do
  146.         if [ -e "${x}/modalias" ]; then
  147.             manual_add_modules $(cat "${x}/modalias")
  148.         fi
  149.     done
  150.  
  151.     if [ -e /proc/ide ]; then
  152.         for x in ide-generic ide-disk ide-cd; do
  153.             manual_add_modules "${x}"
  154.         done
  155.     fi
  156.  
  157.     if [ -e /sys/bus/scsi/devices/ ]; then
  158.         manual_add_modules sd_mod
  159.         if [ -e /sys/module/qla2xxx/ ]; then
  160.             for x in 100 200 300 322 400; do
  161.                 manual_add_firmware "ql2${x}_fw.bin"
  162.             done
  163.         fi
  164.         if [ -e /sys/module/aic94xx/ ]; then
  165.             manual_add_modules sd_mod
  166.             manual_add_firmware "aic94xx-seq.fw"
  167.         fi
  168.     fi
  169.  
  170.     if [ -e /sys/bus/i2o/devices/ ]; then
  171.         manual_add_modules i2o_block
  172.     fi
  173.  
  174.     if [ -e /sys/bus/ps3_system_bus/ ]; then
  175.         for x in ps3_storage gelic_net ohci-hcd ehci-hcd; do
  176.             manual_add_modules "${x}"
  177.         done
  178.     fi
  179. }
  180.  
  181.  
  182. auto_add_firmware()
  183. {
  184.     case "$1" in
  185.     scsi)
  186.         for x in 100 200 300 322 400; do
  187.             manual_add_firmware "ql2${x}_fw.bin"
  188.         done
  189.         manual_add_firmware "aic94xx-seq.fw"
  190.     ;;
  191.     *)
  192.         auto_add_firmware scsi
  193.     ;;
  194.     esac
  195. }
  196.  
  197. # The modules "most" classes added per default to the initramfs
  198. auto_add_modules()
  199. {
  200.     case "$1" in
  201.     base)
  202.         for x in ehci-hcd ohci-hcd uhci-hcd usbhid usb-storage ext2 \
  203.         ext3 isofs jfs nfs reiserfs udf xfs af_packet atkbd i8042; do
  204.             manual_add_modules "${x}"
  205.         done
  206.     ;;
  207.     net)
  208.         for x in 3c59x 8139cp 8139too 8390 b44 bmac bnx2 defxx \
  209.         dl2k e1000 e100 ehea epic100 ep93xx_eth eql fealnx \
  210.         famachi forcedeth  hp100 mace mv643xx_eth myri10ge \
  211.         natsemi ne2k-pci netconsole ns83820 pcnet32 qla3xxx \
  212.         r8169 s2io sis900 skge slhc smc911x starfire \
  213.         sundance sungem sungem_phy sunhme tg3 tlan de2104x \
  214.         de4x5 dmfe tulip winbond-840 xircom_cb xircom_tulip_cb \
  215.         typhon via-rhine via-velocity yellowfin gelic_net; do
  216.             manual_add_modules "${x}"
  217.         done
  218.     ;;
  219.     ide)
  220.         copy_modules_dir kernel/drivers/ide
  221.     ;;
  222.     scsi)
  223.         copy_modules_dir kernel/drivers/scsi
  224.         for x in mptfc mptsas mptscsih mptspi; do
  225.             manual_add_modules "${x}"
  226.         done
  227.         auto_add_firmware scsi
  228.     ;;
  229.     ata)
  230.         copy_modules_dir kernel/drivers/ata
  231.     ;;
  232.     block)
  233.         copy_modules_dir kernel/drivers/block
  234.     ;;
  235.     ieee1394)
  236.         for x in ohci1394 sbp2; do
  237.             manual_add_modules "${x}"
  238.         done
  239.     ;;
  240.     i2o)
  241.         for x in i2o_block; do
  242.             manual_add_modules "${x}"
  243.         done
  244.     ;;
  245.     dasd)
  246.         for x in dasd_eckd_mod dasd_fba_mod; do
  247.             manual_add_modules "${x}"
  248.         done
  249.     ;;
  250.     *)
  251.         auto_add_modules base
  252.         auto_add_modules net
  253.         auto_add_modules ide
  254.         auto_add_modules scsi
  255.         auto_add_modules ata
  256.         auto_add_modules i2o
  257.         auto_add_modules dasd
  258.         auto_add_modules ieee1394
  259.         auto_add_modules block
  260.     ;;
  261.     esac
  262. }
  263.  
  264. usage()
  265. {
  266.     cat >&2 << EOF
  267.  
  268. Usage: ${0} [OPTION]... <-o outfile> [version]
  269.  
  270. Options:
  271.   -d confdir  Specify an alternative configuration directory.
  272.   -k          Keep temporary directory used to make the image.
  273.   -o outfile  Write to outfile.
  274.   -r root     Override ROOT setting in mkinitrd.conf.
  275.  
  276. See mkinitramfs(8) for further details.
  277. EOF
  278.     exit 1
  279.  
  280. }
  281.  
  282. # minimal supported kernel version
  283. check_minkver()
  284. {
  285.     curversion=${1}
  286.     initdir=${2}
  287.     if [ -z ${initdir} ]; then
  288.         DPKG_ARCH=`dpkg --print-installation-architecture`
  289.         case ${DPKG_ARCH} in
  290.             ia64|hppa)
  291.                 minversion="2.6.15"
  292.             ;;
  293.             *)
  294.                 minversion="2.6.12"
  295.             ;;
  296.         esac
  297.         if dpkg --compare-versions "${curversion}" lt "${minversion}"; then
  298.             echo "W: kernel ${curversion} too old for initramfs on ${DPKG_ARCH}" >&2
  299.             echo "W: not generating requested initramfs for kernel ${curversion}" >&2
  300.             exit 2
  301.         fi
  302.         return 0
  303.     fi
  304.     set_initlist
  305.     for cm_x in ${initlist}; do
  306.         tmp=$(eval echo $(grep ^MINKVER ${initdir}/${cm_x} | cut -d'=' -f2))
  307.         if dpkg --compare-versions "${curversion}" lt "${tmp}"; then
  308.             echo "W: ${cm_x} hook script requires at least kernel version ${tmp}" >&2
  309.             echo "W: not generating requested initramfs for kernel ${curversion}" >&2
  310.             exit 2
  311.         fi
  312.     done
  313. }
  314.